/* Ingeniería - Eliminar equipo patrón */

package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ClaseEquipoPatronDTO;
import edu.shared.DTO.EquipoPatronDTO;
import edu.shared.DTO.SubclaseEquipoPatronDTO;

public class P_EliminarEquipoPatron extends Composite {
	
	private String tituloTab;
	TabPanel padre;
	
	private ListBox claseCombo;
	private ListBox subclaseCombo;
	private Button filtrarBtn;
	private Button eliminarEquipoBtn;
	private FlexTable equiposPatronFT;
	
	private final String NO_EXISTEN_CLASES = "NO EXISTEN CLASES";
	private final String TODAS_LAS_CLASES = "TODAS LAS CLASES";
	private final String TODAS_LAS_SUBCLASES = "TODAS LAS SUBCLASES";
	
	//columnas para la tabla equipos patrón
	private static final int CHECK = 0;
	private static final int COL_CODIGO = 1;
	private static final int COL_CLASE = 2;
	private static final int COL_SUBCLASE = 3;
	private static final int COL_PLANO = 4;
	private static final int COL_ULTIMA_VERSION = 5;
	private static final int COL_MAS_INFO = 6;
	
	private IngenieriaServiceAsync ingenieriaService;	

	public P_EliminarEquipoPatron(TabPanel padre, String titulo) {
		
		this.tituloTab = titulo;
		this.padre = padre;
		ingenieriaService = GWT.create(IngenieriaService.class);
	
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "597px");
		
		/// SECCIÓN FILTRADO
		
		Label filtrarPorLabel = new Label("FILTROS");
		filtrarPorLabel.setStyleName("labelTitulo");
		layoutPanel.add(filtrarPorLabel);
		layoutPanel.setWidgetLeftWidth(filtrarPorLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(filtrarPorLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label claseLabel = new Label("CLASE:");
		claseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseLabel);
		layoutPanel.setWidgetLeftWidth(claseLabel, 5.0, Unit.PCT, 12.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseLabel, 87.0, Unit.PX, 19.0, Unit.PX);
		
		// LISTA DESPLEGABLE CLASE DE EQUIPO.

		claseCombo = new ListBox();
		layoutPanel.add(claseCombo);
		layoutPanel.setWidgetLeftWidth(claseCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseCombo, 82.0, Unit.PX, 32.0, Unit.PX);
		
		claseCombo.addChangeHandler(new ChangeHandler() {

			@Override
			public void onChange(ChangeEvent event) {
				
				String itemSeleccionado = claseCombo.getItemText(claseCombo.getSelectedIndex());
				
				// si se selecciona TODAS LAS CLASES.
				if (itemSeleccionado.equals(TODAS_LAS_CLASES)) {
					
					subclaseCombo.setEnabled(false);
					subclaseCombo.clear();
				}
				
				// si se selecciona una clase específica.
				else {
					
					subclaseCombo.clear();
					
					// se toma el código de la clase.
					int codigoClase = Integer.parseInt(itemSeleccionado.split(" ")[0]);
					
					//se carga la lista desplegable de subclases, para la clase seleccionada.
					cargarSubclasesEquipoPatron(codigoClase);
					subclaseCombo.setEnabled(true);
				}
			}
		});		
		
		//
		
		Label subclaseLabel = new Label("SUBCLASE:");
		subclaseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseLabel);
		layoutPanel.setWidgetLeftWidth(subclaseLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseLabel, 87.0, Unit.PX, 19.0, Unit.PX);
		
		subclaseCombo = new ListBox();
		layoutPanel.add(subclaseCombo);
		layoutPanel.setWidgetLeftWidth(subclaseCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseCombo, 82.0, Unit.PX, 32.0, Unit.PX);
		
		// botón FILTRAR		
		filtrarBtn = new Button("BUSCAR");
		layoutPanel.add(filtrarBtn);
		layoutPanel.setWidgetLeftWidth(filtrarBtn, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(filtrarBtn, 132.0, Unit.PX, 28.0, Unit.PX);
		
		filtrarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				// se desactiva el botón mientras se ejecuta la orden.
				filtrarBtn.setEnabled(false);
				
				// primero se eliminan las filas.
				int cantidadFilasEliminar = equiposPatronFT.getRowCount() - 1;
				for (int i=cantidadFilasEliminar; i > 0 ; i--) {
					equiposPatronFT.removeRow(i);
				}
								
				// se cargan los equipos patrón de acuerdo a la clase y subclase seleccionadas.
				cargarEquiposPatron();
				
				// se vuelve a activar el botón.
				filtrarBtn.setEnabled(true);
			}
		});
		
		///
		
		/// SECCIÓN EQUIPOS PATRÓN
		
		Label equiposPatronLabel = new Label("EQUIPOS PATRÓN");
		equiposPatronLabel.setStyleName("labelTitulo");
		layoutPanel.add(equiposPatronLabel);
		layoutPanel.setWidgetLeftWidth(equiposPatronLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposPatronLabel, 163.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel equiposPatronSP = new ScrollPanel();
		equiposPatronSP.setStyleName("tabla");
		layoutPanel.add(equiposPatronSP);
		layoutPanel.setWidgetLeftWidth(equiposPatronSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposPatronSP, 230.0, Unit.PX, 250.0, Unit.PX);
		
		equiposPatronFT = new FlexTable();
		equiposPatronSP.setWidget(equiposPatronFT);
		equiposPatronFT.setSize("100%", "100%");
		
		// se carga el encabezado de la tabla.
		// columna CHECK (sirve para saber qué fila está seleccionada)
		equiposPatronFT.setText(0, CHECK, "");
		equiposPatronFT.getCellFormatter().setWidth(0, CHECK, "4%");
		
		// columna CÓDIGO
		equiposPatronFT.setText(0, COL_CODIGO, "CÓDIGO");
		equiposPatronFT.getCellFormatter().setWidth(0, COL_CODIGO, "20%");
		
		// columna CLASE
		equiposPatronFT.setText(0, COL_CLASE, "CLASE");
		equiposPatronFT.getCellFormatter().setWidth(0, COL_CLASE, "25%");
						
		// columna SUBCLASE
		equiposPatronFT.setText(0, COL_SUBCLASE, "SUBCLASE");
		equiposPatronFT.getCellFormatter().setWidth(0, COL_SUBCLASE, "25%");
		
		// columna PLANO
		equiposPatronFT.setText(0, COL_PLANO, "PLANO");
		equiposPatronFT.getCellFormatter().setWidth(0, COL_PLANO, "9%");
		
		//columna ÚLTIMA VERSIÓN
		equiposPatronFT.setText(0, COL_ULTIMA_VERSION, "ÚLTIMA VERSIÓN");
		equiposPatronFT.getCellFormatter().setWidth(0, COL_ULTIMA_VERSION, "9%");
		
		// columna MÁS INFORMACIÓN
		equiposPatronFT.setText(0, COL_MAS_INFO, "+ INFO");
		equiposPatronFT.getCellFormatter().setWidth(0, COL_MAS_INFO, "8%");
		
		// se setea el estilo a los encabezados
		equiposPatronFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		///
		
		/// SECCIÓN PIE
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 463.0, Unit.PX, 50.0, Unit.PX);
		
		eliminarEquipoBtn = new Button("ELIMINAR");
		layoutPanel.add(eliminarEquipoBtn);
		layoutPanel.setWidgetRightWidth(eliminarEquipoBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(eliminarEquipoBtn, 22.0, Unit.PX, 28.0, Unit.PX);
		
		eliminarEquipoBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				eliminarEquipoBtn.setEnabled(false);
				
				String codigoEquipoSeleccionado = equipoPatronSeleccionado();
				
				// si no hay ningún equipo patrón seleccionado.
				if (codigoEquipoSeleccionado.equals("-1")) {
					Window.alert("Seleccione un equipo patrón.");
					eliminarEquipoBtn.setEnabled(true);
				}
				
				else {
					eliminarEquipoPatron(codigoEquipoSeleccionado);
				}
			}
		});		
		
		Button salirBtn = new Button("CANCELAR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(salirBtn, 22.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				salir(event);
			}
		});
		
		///
		
		/// CARGA DE LOS DATOS DE LA PANTALLA
		cargarDatosPantalla();	
		///
	}
	
	/** Método que carga la lista desplegable de clases de equipo patrón.
	 * Muestra código y nombre de la clase.
	 */
	private void cargarDatosPantalla() {
	
		// se carga la lista desplegable de clases
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>() {
			
			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> listaClasesEquipoPatronDTO) {

				// si aún no se han creado ninguna clase de equipo patrón.
				if (listaClasesEquipoPatronDTO.isEmpty()) {
					claseCombo.setEnabled(false);
					claseCombo.addItem(NO_EXISTEN_CLASES);
				}
				
				else {
				
					// ítem que permite buscar todos los equipos patrón.
					claseCombo.addItem(TODAS_LAS_CLASES);
					
					// se agregan las clases.
					for(ClaseEquipoPatronDTO claseEquipoPatronDTO: listaClasesEquipoPatronDTO) {
						
						// se agrega como ítem al código de la clase seguido de su nombre de clase.
						claseCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
					}
					
					// como el ítem seleccionado por default es TODAS LAS CLASES, se desactiva la lista desplegable de SUBCLASES, hasta tanto no se seleccione una clase.
					subclaseCombo.setEnabled(false);
				}
				
				/// CARGA DE LA TABLA DE EQUIPOS PATRÓN (si se tuvo éxito en cargar la lista desplegable de clases, se pasa a cargar los equipos en la tabla)
				cargarEquiposPatron();
				///
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
	}
	
	/** Método que carga la lista desplegable de subclases de equipo patrón.
	 * Muestra código y nombre de la subclase.
	 */	
	private void cargarSubclasesEquipoPatron (int codigoClase) {
		
		ingenieriaService.buscarSubclasesEquipoPatron(codigoClase, new AsyncCallback<List<SubclaseEquipoPatronDTO>>() {
			
			@Override
			public void onSuccess(List<SubclaseEquipoPatronDTO> listaSubclasesEquipoPatronDTO) {

				// se carga la opción para mostrar todas las subclases.
				subclaseCombo.addItem(TODAS_LAS_SUBCLASES);
				
				// se cargan las subclases.
				for (SubclaseEquipoPatronDTO subclaseEquipo: listaSubclasesEquipoPatronDTO) {
					subclaseCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipo.getCodigoSubclase()) + " - " + subclaseEquipo.getNombre());
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}	
		});		
	}
	
	/**
	 * Método que carga los equipos patrón en la tabla, de acuerdo a los datos seleccionados en las listas desplegables de clase y subclase.
	 */
	private void cargarEquiposPatron () {
		
		String claseSeleccionada = claseCombo.getItemText(claseCombo.getSelectedIndex());
	
		// si existe al menos una clase.
		if (!claseSeleccionada.equals(NO_EXISTEN_CLASES)) {

			int codigoClase = -1; // carga todas las clases.
			int codigoSubclase = -1; // carga todas las subclases para la clase seleccionada.
			
			// si se selecciona una clase específica, se toma su código.
			if (!claseSeleccionada.equals(TODAS_LAS_CLASES)) {				
				codigoClase = Integer.parseInt(claseSeleccionada.split(" ")[0]);
				
				String subclaseSeleccionada = subclaseCombo.getItemText(subclaseCombo.getSelectedIndex());	
				
				// si se selecciona una subclase específica, se toma su código.
				if (!subclaseSeleccionada.equals(TODAS_LAS_SUBCLASES)) {				
					codigoSubclase = Integer.parseInt(subclaseSeleccionada.split(" ")[0]);
				}
			}
			
			// se buscan los equipos patrón especificados.
			ingenieriaService.buscarEquiposPatronUltimaVersion(codigoClase, codigoSubclase, new AsyncCallback<List<EquipoPatronDTO>>() {

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO");					
				}

				@Override
				public void onSuccess(List<EquipoPatronDTO> listaEquiposPatronDTO) {
					
					List<EquipoPatronDTO> listaEquiposPatronDTOActivos = filtrarEquiposActivos(listaEquiposPatronDTO);

					for (int i = 0; i < listaEquiposPatronDTOActivos.size(); i++) {
						
						EquipoPatronDTO equipoPatronDTO = listaEquiposPatronDTOActivos.get(i);
						
						// columna para selección
						
						RadioButton radioButton = new RadioButton("equipo patrón seleccionado","");						
						equiposPatronFT.setWidget(i + 1, CHECK, radioButton);
						equiposPatronFT.getFlexCellFormatter().setHorizontalAlignment(i + 1, CHECK, HasHorizontalAlignment.ALIGN_CENTER);
						
						// columna CÓDIGO
						
						String codigoEquipoPatron = Validaciones.rellenarCodigoEquipoPatron(equipoPatronDTO);						
						equiposPatronFT.setWidget(i + 1, COL_CODIGO, new Label(codigoEquipoPatron));
						equiposPatronFT.getCellFormatter().setWordWrap(i+1, COL_CODIGO, true);
						
						// columna CLASE
						
						equiposPatronFT.setWidget(i + 1, COL_CLASE, new Label(equipoPatronDTO.getNombreClase()));
						equiposPatronFT.getCellFormatter().setWordWrap(i+1, COL_CLASE, true);
						
						// columna SUBCLASE
						
						equiposPatronFT.setWidget(i + 1, COL_SUBCLASE, new Label(equipoPatronDTO.getNombreSubclase()));
						equiposPatronFT.getCellFormatter().setWordWrap(i+1, COL_SUBCLASE, true);
						
						// columna PLANO
						
						// se da formato al número de plano.
						String plano = (String) (equipoPatronDTO.getPlano() / 10 < 1 ? "0" + equipoPatronDTO.getPlano() : equipoPatronDTO.getPlano());
						equiposPatronFT.setWidget(i + 1, COL_PLANO, new Label(plano));
						equiposPatronFT.getCellFormatter().setWordWrap(i+1, COL_PLANO, true);
						
						// columna ÚLTIMA VERSIÓN
						
						equiposPatronFT.setWidget(i + 1, COL_ULTIMA_VERSION, new Label(equipoPatronDTO.getNroVersion()));
						equiposPatronFT.getCellFormatter().setWordWrap(i+1, COL_ULTIMA_VERSION, true);

						// columna MÁS INFO
						
						Label info = new Label("");
						info.setSize("16px", "16px");
						info.setStyleName("labelInfo");						
						equiposPatronFT.setWidget(i + 1, COL_MAS_INFO, info);
						equiposPatronFT.getFlexCellFormatter().setHorizontalAlignment(i + 1, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
						
						equiposPatronFT.getRowFormatter().setStyleName(i + 1, "tablaRenglon");
						
						info.addClickHandler(new ClickHandler() {
							public void onClick(ClickEvent event) {
								Cell celda = equiposPatronFT.getCellForEvent(event);
								masInformacionEquipoPatron(celda);
							}
						});
					}
				}
			});		
		}
		
		// si no existe ningún equipo patrón cargado, se avisa al usuario y se deshabilita el botón ELIMINAR EQUIPO PATRÓN.
		else {
			
			eliminarEquipoBtn.setEnabled(false);
			
			Window.alert("Aún no se ha cargado ningún equipo patrón.");
		}
	}
	
	private void masInformacionEquipoPatron(Cell celda) {	
		
		String codigoEquipo = equiposPatronFT.getText(celda.getRowIndex(), COL_CODIGO);
		
		final P_DetalleEquipoPatron popUp = new P_DetalleEquipoPatron(codigoEquipo);
		popUp.setGlassEnabled(true);
		popUp.center();
		popUp.show();
	}
	
	public String equipoPatronSeleccionado() {
		
		String codigoEquipoSeleccionado = "-1";

		for(int i=1; i < equiposPatronFT.getRowCount() && codigoEquipoSeleccionado.equals("-1"); i++) {
			
			RadioButton radiobutton = (RadioButton) equiposPatronFT.getWidget(i, CHECK);
			
			if(radiobutton.getValue() == true) { 
				codigoEquipoSeleccionado = equiposPatronFT.getText(i, COL_CODIGO);
			}
		}
		
		return codigoEquipoSeleccionado;
	}
	
	private void eliminarEquipoPatron(String codigoEquipoSeleccionado) {
	
		// se intenta eliminar el equipo patrón seleccionado
		ingenieriaService.eliminarEquipoPatron(codigoEquipoSeleccionado, new AsyncCallback<Boolean>() {
		
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());
				eliminarEquipoBtn.setEnabled(true);
			}

			@Override
			public void onSuccess(Boolean exito) {
				
				if (exito) {
					
					Window.alert("El equipo patrón ha sido eliminado.");
										
					// primero se eliminan las filas.
					int cantidadFilasEliminar = equiposPatronFT.getRowCount() - 1;
					for (int i=cantidadFilasEliminar; i > 0 ; i--) {
						equiposPatronFT.removeRow(i);
					}
					
					// luego se actualiza la tabla de equipos patrón
					cargarEquiposPatron();
					eliminarEquipoBtn.setEnabled(true);
				}
				
				else {
					Window.alert("No se ha podido eliminar el equipo patrón seleccionado.");
					eliminarEquipoBtn.setEnabled(true);
				}
			}		
		});
	}
	

	private List<EquipoPatronDTO> filtrarEquiposActivos(List<EquipoPatronDTO> listaEquiposPatronDTO) {

		List<EquipoPatronDTO> listaEquiposActivos = new LinkedList<EquipoPatronDTO>();
		
		for (EquipoPatronDTO e: listaEquiposPatronDTO) {
			
			if (e.isActivo()) {
				listaEquiposActivos.add(e);
			}
		}
		
		return listaEquiposActivos;
	}		
	
	public void salir(ClickEvent event) {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}
